package com.tianji.promotion.handler;

import com.tianji.common.utils.BooleanUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.core.StringRedisTemplate;

import java.util.concurrent.TimeUnit;

@RequiredArgsConstructor(onConstructor_ = {@Lazy})
public class RedisLock {
    private final String key;
    private final StringRedisTemplate redisTemplate;


    /*
    *
    * 底层是运用redis的这个方法opsForValue().setIfPresent 1.存放值,如果为空则返回成功 ,有值则返回失败
    * 2.还能设置值自动删除时间  就是锁超时自动删除 这样线程宕机也没事 到时间锁自动释放
    * 存放成功则证明这一时间没有线程操作改用户对象
    * */


    // 添加锁 并设置过期时间
    public boolean tryLock(Long leaseTime, TimeUnit unit){
        //获得线程名称
        String name = Thread.currentThread().getName();
        //设置锁 及过期时间
        Boolean aBoolean = redisTemplate.opsForValue().setIfPresent(key, name, leaseTime, unit);
        //返回结果
        return BooleanUtils.isTrue(aBoolean);
    }

    // 归还锁
    public void unLock(){
        redisTemplate.delete(key);
    }
}
